package net.servir.capacidades.web.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.Ambito;
import net.servir.capacidades.model.BancoPregunta;
import net.servir.capacidades.model.DemoParticipante;
import net.servir.capacidades.model.ExmPerfil;
import net.servir.capacidades.model.FuncionLeyenda;
import net.servir.capacidades.model.NivelGobierno;
import net.servir.capacidades.model.PreguntaReporte;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.SectorPregunta;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.Enumerados.GrupoDatosMaestro;
import net.servir.capacidades.model.Enumerados.ProfundidadDatosSistema;
import net.servir.capacidades.model.jsp.JspAlgoritmoTest;
import net.servir.capacidades.service.AlgoritmoService;
import net.servir.capacidades.service.BancoPreguntaService;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.MantenimientoService;
import net.servir.capacidades.service.SistemaAdmService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class AlgoritmoTestController {

	@Autowired 
	private CapacidadesService capacidadesService;
	
	@Autowired 
	private AlgoritmoService algoritmoService;

	@Autowired 
	private BancoPreguntaService bancoPreguntaService;

	@Autowired 
	private SistemaAdmService sistemaAdmService;

	@Autowired 
	private MantenimientoService mantenimientoService;
	
	@RequestMapping("/algoritmoTest.htm")
	public @ModelAttribute("algoritmo")
	JspAlgoritmoTest simularAlgoritmo(HttpServletRequest request,HttpServletResponse response) throws Exception {
		
		JspAlgoritmoTest obj = new JspAlgoritmoTest();
		
		//************************************************************
		// se obtiene el dni de la session activa
		//************************************************************
		
		HttpSession session = request.getSession();
		String cod_session =session.getId();

		String dniResponsable = null;
		if(session.getAttribute("dni") != null)			
			dniResponsable = session.getAttribute("dni").toString();
		
		//Obtenemos los datos del Usuario
		Usuario usuario = capacidadesService.GetUsuarioIdentificacion(dniResponsable);
		
		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");
		
		obj.setUsuario(usuario);				
		//************************************************************
		
		ExmPerfil exmPerfil = null;
		Number idExmPerfil = null;
		Number idSistema = null;
		//Number idAmbito = null;
		
		String accion = null;
		if (request.getParameter("id_exm_perfil") != null && !request.getParameter("id_exm_perfil").equals(""))
			idExmPerfil = Integer.parseInt(request.getParameter("id_exm_perfil"));
		
		if (idExmPerfil != null)
		{
			exmPerfil = algoritmoService.getExmPerfil(idExmPerfil);
			idSistema = exmPerfil.getId_sistema();
		}		
		obj.setExm_perfil(exmPerfil);
		
		
		//Obtenemos las listas
		List<NivelGobierno> lstNivelGobierno = capacidadesService.ObtenerNivelGobiernos();
		List<PuestoTipo> lstPuestoTipo = mantenimientoService.getPuestoTipos(idSistema);
		List<FuncionLeyenda> lstFuncionLeyenda = mantenimientoService.getFuncionesPorSistema(idSistema,GrupoDatosMaestro.GENERAL);		
		List<SectorPregunta> lstSectorPregunta = mantenimientoService.getSectoresPregunta(GrupoDatosMaestro.GENERAL);
		List<BancoPregunta> lstBancoPregunta = bancoPreguntaService.getBancosPregunta();
		
		obj.setLstNivelGobierno(lstNivelGobierno);
		obj.setLstPuestoTipo(lstPuestoTipo);
		obj.setLstFuncion(lstFuncionLeyenda);
		obj.setLstSectorPregunta(lstSectorPregunta);
		obj.setLstBancoPregunta(lstBancoPregunta);

		
		String listaFunciones = request.getParameter("lista_funciones");
		Number idPuestoTipo = null;
		if (request.getParameter("id_puesto_tipo") != null && !request.getParameter("id_puesto_tipo").equals(""))
			idPuestoTipo = Integer.parseInt(request.getParameter("id_puesto_tipo"));
		Number idNivelGobierno = null;
		if (request.getParameter("id_nivel_gobierno") != null && !request.getParameter("id_nivel_gobierno").equals(""))
			idNivelGobierno = Integer.parseInt(request.getParameter("id_nivel_gobierno"));
		Number idSectorPregunta = null;
		if (request.getParameter("id_sector_pregunta") != null && !request.getParameter("id_sector_pregunta").equals(""))
			idSectorPregunta = Integer.parseInt(request.getParameter("id_sector_pregunta"));
		Number idBancoPregunta = null;
		if (request.getParameter("id_banco_pregunta") != null && !request.getParameter("id_banco_pregunta").equals(""))
			idBancoPregunta = Integer.parseInt(request.getParameter("id_banco_pregunta"));
		Number idAmbito = null;
		if (idSistema != null)
		{
			Sistema sistema = sistemaAdmService.getSistema(idSistema, ProfundidadDatosSistema.CON_AMBITOS);
			for (Ambito ambito : sistema.getAmbitos()) {
				idAmbito = ambito.getId_ambito();
			}			
		}
		
		//String codEstadoParticipante = null;
		// obtener valores del accion de usuario
		accion = request.getParameter("accion");
		String tipoEdicion = request.getParameter("tipo_edicion");
		if (tipoEdicion == null || tipoEdicion.equals(""))
		{
			if (idExmPerfil == null)
				tipoEdicion = "NUEVO";
			else
				tipoEdicion = "MODIFICAR";
		}	
		
		obj.setTipo_edicion(tipoEdicion);
		
		String redirect = "";
		String mensajeUsuario = "";
		// set valores de los controles
		if(accion != null && !accion.equals(""))
		{
			obj.setId_puesto_tipo(idPuestoTipo);
			obj.setId_nivel_gobierno(idNivelGobierno);
			obj.setId_sector_pregunta(idSectorPregunta);
			obj.setLista_funciones(listaFunciones);
			obj.setId_banco_pregunta(idBancoPregunta);
			
			if(accion.equals("GENERAR_TEST"))
			{
				
				
				DemoParticipante demoParticipante = new DemoParticipante();
				
				Number idDemoParticipante = 1;
				
				demoParticipante.setId_demo_participante(idDemoParticipante);
				demoParticipante.setId_exm_perfil(idExmPerfil);
				demoParticipante.setId_nivel_gobierno(idNivelGobierno);
				demoParticipante.setId_puesto_tipo(idPuestoTipo);
				demoParticipante.setId_sector_pregunta(idSectorPregunta);
				demoParticipante.setId_banco_pregunta(idBancoPregunta);
				demoParticipante.setId_ambito(idAmbito);
				
				idDemoParticipante = algoritmoService.grabarDemoParticipante(demoParticipante,listaFunciones);	
				algoritmoService.generarTestDemo(idDemoParticipante);
								
				List<PreguntaReporte> lstPreguntasGeneradas = algoritmoService.getPreguntasGeneradasDemo(idDemoParticipante);
				obj.setLstPreguntasGeneradas(lstPreguntasGeneradas);
			}			

			obj.setMensaje_usuario(mensajeUsuario);
			
		}
		return obj;
	}

}
